跳到主要内容

指针事件(Pointer Events)

你可以在实现了 pointerDownpointerMovepointerUppointerExit 的脚本中监听指针事件(Pointer Events)。这些函数可用于 节点脚本(Node Scripts)布局脚本(Layout Scripts)

-- Pointer event callbacks have parameters of `self` and a `PointerEvent`.
function handlePointerDown(self: MyNode, event: PointerEvent)
-- Pointer location in local coordinates relative to the script.
print(event.position.x, event.position.y)

-- the pointer identifier (useful for multi-touch)
print(event.id)

-- Marks the event as handled and prevents propagation.
event:hit()
-- event:hit(true) -- handled, but allowed to pass through translucent elements
end

-- Register your pointer handlers by assigning functions to pointerDown,
-- pointerUp, pointerMove, or pointerExit in the script’s returned table.
return function(): Node<MyScript>
return {
init = init,
draw = draw,
advance = advance,
pointerDown = myPointerDownFunction,
}
end

多点触控(Multi-touch)

使用 event.id 可以跟踪多个活动指针。

type ActiveId = {
position: Vec2D,
}

export type TrackPointers = {
-- Keep track of the position for each of the pointers
activePointers: { ActiveId },
}

function onPointerDown(self: TrackPointers, event: PointerEvent)
-- Save an item in the table for each pointer down
self.activePointers[event.id] = {
position = event.position,
}

print('New pointer down: ' .. event.id)
print('Position: ' .. event.position.x .. event.position.y)

event:hit()
end

function onPointerMove(self: TrackPointers, event: PointerEvent)
if self.activePointers[event.id] then
self.activePointers[event.id].position = event.position

-- Print all currently active pointer IDs
print('Active pointer IDs:')
for id, pointer in self.activePointers do
print(' id: ', id)
print(' x:', pointer.position.x)
print(' y:', pointer.position.y)
end
end

event:hit()
end

function onPointerUp(self: TrackPointers, event: PointerEvent)
self.activePointers[event.id] = nil

print('Pointer up: ' .. event.id)
print('Position: ' .. event.position.x .. event.position.y)

event:hit()
end

return function(): Node<TrackPointers>
return {
init = init,
advance = advance,
draw = draw,
pointerDown = onPointerDown,
pointerMove = onPointerMove,
pointerUp = onPointerUp,
activePointers = {},
}
end

嵌套指针事件(Nested Pointer Events)

Rive 默认只在主画板(Main Artboard)监听指针事件。如果你需要在实例化画板中处理指针事件,需要手动转发。

-- Handle pointer events in the main script
function handlePointerDown(self: MyScript, event: PointerEvent)
-- self.enemy.pointerDown(self.enemy, event)
for _, enemy in self.enemies do
-- Convert the incoming pointer position into the enemy's local space.
-- This example assumes enemy.position is in the same coordinate system.
local localEvent = PointerEvent.new(
event.id,
Vec2D.xy(
-- Normalize the pointer position based on the artboard's position
event.position.x - enemy.position.x,
event.position.y - enemy.position.y
)
)

-- Forward the event into the instantiated artboard
self.enemy:pointerDown(localEvent)
end
end